package br.com.jbssistemas.dirfweb.managedbeans;

import br.com.jbssistemas.dirfweb.daos.BeneficiarioDAO;
import br.com.jbssistemas.dirfweb.daos.DirfItemDAO;
import br.com.jbssistemas.dirfweb.daos.EmpresaDAO;
import br.com.jbssistemas.dirfweb.daos.RetencaoDAO;
import br.com.jbssistemas.dirfweb.entidades.Beneficiario;
import br.com.jbssistemas.dirfweb.entidades.DirfItem;
import br.com.jbssistemas.dirfweb.entidades.Empresa;
import br.com.jbssistemas.dirfweb.entidades.Retencao;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.Serializable;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.inject.Named;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author Renato Machado / Daniel Tavares
 *
 */
@Named(value = "uploadMB")
@ViewScoped
public class UploadMB implements Serializable {

    public UploadMB() {
    }

    @Inject
    private BeneficiarioDAO beneficiarioDAO;

    @Inject
    private EmpresaDAO empresaDAO;

    @Inject
    private DirfItemDAO dirfItemDAO;
    
    @Inject
    private RetencaoDAO retencaoDAO;

    public void uploadDirf(FileUploadEvent event) {

        Empresa empresa = new Empresa();
        Beneficiario beneficiario = new Beneficiario();
        DirfItem dirfItem = new DirfItem();
        Retencao retencao = new Retencao();
        String anoExercicio = "";
        String anoCalendario = "";

        try {

            InputStreamReader isr = new InputStreamReader(event.getFile().getInputstream());
            BufferedReader buffer = new BufferedReader(isr);

            String linha = null;

            w:
            while ((linha = buffer.readLine()) != null && !linha.isEmpty()) {

                if (linha.endsWith("||")) {
                    int tamanho = linha.length();
                    linha = linha.substring(0, tamanho - 1) + "0|";
                }

                String[] colunas = linha.split("[|]");

                System.out.println("LINHA: " + linha);

                for (int i = 0; i < colunas.length; i++) {

                    System.out.println("COLUNA: " + colunas[i]);

                    switch (colunas[i]) {

                        case "DIRF":

                            anoExercicio = colunas[1];
                            anoCalendario = colunas[2];

                            continue w;

                        case "IDREC":

                            retencao = retencaoDAO.getRetencaoByCodigo(colunas[1]);

                            continue w;

                        case "RESPO":

                            empresa.setCpfResponsavel(colunas[1]);
                            empresa.setNomeResponsavel(colunas[2]);
                            System.out.println("Responsavel: " + empresa.getCpfResponsavel() + " - " + empresa.getNomeResponsavel());

                            continue w;

                        case "DECPJ":

                            empresa.setCnpj(colunas[1]);
                            empresa.setNome(colunas[2]);
                            System.out.println("Município: " + empresa.getCnpj() + " - " + empresa.getNome());

                            continue w;

                        case "BPFDEC":

                            beneficiario.setDocumento(colunas[1]);
                            beneficiario.setNome(colunas[2]);
                            System.out.println("Contribuinte: " + beneficiario.getDocumento() + " - " + beneficiario.getNome());

                            /**
                             * Verificar se beneficiario está nulo e inserir no
                             * banco
                             */
                            if (beneficiarioDAO.getByDocumento(beneficiario.getDocumento()) == null) {
                                beneficiarioDAO.salvar(beneficiario);
                            }

                            continue w;

                        case "RTRT":

                            dirfItem.setAnoExercicio(anoExercicio);
                            dirfItem.setAnoCalendario(anoCalendario);
                            dirfItem.setSigla(colunas[0]);
                            dirfItem.setRetencao(retencao);
                            /*****************************/
                            dirfItem.setValorRendimentoJAN(Double.parseDouble(colunas[1].equals("") ? "0.0" : colunas[1]) / 100);
                            dirfItem.setValorRendimentoFEV(Double.parseDouble(colunas[2].equals("") ? "0.0" : colunas[2]) / 100);
                            dirfItem.setValorRendimentoMAR(Double.parseDouble(colunas[3].equals("") ? "0.0" : colunas[3]) / 100);
                            dirfItem.setValorRendimentoABR(Double.parseDouble(colunas[4].equals("") ? "0.0" : colunas[4]) / 100);
                            dirfItem.setValorRendimentoMAI(Double.parseDouble(colunas[5].equals("") ? "0.0" : colunas[5]) / 100);
                            dirfItem.setValorRendimentoJUN(Double.parseDouble(colunas[6].equals("") ? "0.0" : colunas[6]) / 100);
                            dirfItem.setValorRendimentoJUL(Double.parseDouble(colunas[7].equals("") ? "0.0" : colunas[7]) / 100);
                            dirfItem.setValorRendimentoAGO(Double.parseDouble(colunas[8].equals("") ? "0.0" : colunas[8]) / 100);
                            dirfItem.setValorRendimentoSET(Double.parseDouble(colunas[9].equals("") ? "0.0" : colunas[9]) / 100);
                            dirfItem.setValorRendimentoOUT(Double.parseDouble(colunas[10].equals("") ? "0.0" : colunas[10]) / 100);
                            dirfItem.setValorRendimentoNOV(Double.parseDouble(colunas[11].equals("") ? "0.0" : colunas[11]) / 100);
                            dirfItem.setValorRendimentoDEZ(Double.parseDouble(colunas[12].equals("") ? "0.0" : colunas[12]) / 100);
                            dirfItem.setValorRendimentoDEC(Double.parseDouble(colunas[13].equals("") ? "0.0" : colunas[13]) / 100);

                            break;

                        case "RTPO":

                            dirfItem.setAnoExercicio(anoExercicio);
                            dirfItem.setAnoCalendario(anoCalendario);
                            dirfItem.setSigla(colunas[0]);
                            dirfItem.setRetencao(retencao);
                            /*****************************/
                            dirfItem.setValorPrevOficialJAN(Double.parseDouble(colunas[1].equals("") ? "0.0" : colunas[1]) / 100);
                            dirfItem.setValorPrevOficialFEV(Double.parseDouble(colunas[2].equals("") ? "0.0" : colunas[2]) / 100);
                            dirfItem.setValorPrevOficialMAR(Double.parseDouble(colunas[3].equals("") ? "0.0" : colunas[3]) / 100);
                            dirfItem.setValorPrevOficialABR(Double.parseDouble(colunas[4].equals("") ? "0.0" : colunas[4]) / 100);
                            dirfItem.setValorPrevOficialMAI(Double.parseDouble(colunas[5].equals("") ? "0.0" : colunas[5]) / 100);
                            dirfItem.setValorPrevOficialJUN(Double.parseDouble(colunas[6].equals("") ? "0.0" : colunas[6]) / 100);
                            dirfItem.setValorPrevOficialJUL(Double.parseDouble(colunas[7].equals("") ? "0.0" : colunas[7]) / 100);
                            dirfItem.setValorPrevOficialAGO(Double.parseDouble(colunas[8].equals("") ? "0.0" : colunas[8]) / 100);
                            dirfItem.setValorPrevOficialSET(Double.parseDouble(colunas[9].equals("") ? "0.0" : colunas[9]) / 100);
                            dirfItem.setValorPrevOficialOUT(Double.parseDouble(colunas[10].equals("") ? "0.0" : colunas[10]) / 100);
                            dirfItem.setValorPrevOficialNOV(Double.parseDouble(colunas[11].equals("") ? "0.0" : colunas[11]) / 100);
                            dirfItem.setValorPrevOficialDEZ(Double.parseDouble(colunas[12].equals("") ? "0.0" : colunas[12]) / 100);
                            dirfItem.setValorPrevOficialDEC(Double.parseDouble(colunas[13].equals("") ? "0.0" : colunas[13]) / 100);

                            break;

                        case "RTDP":

                            dirfItem.setAnoExercicio(anoExercicio);
                            dirfItem.setAnoCalendario(anoCalendario);
                            dirfItem.setSigla(colunas[0]);
                            dirfItem.setRetencao(retencao);
                            /*****************************/
                            dirfItem.setValorDependentesJAN(Double.parseDouble(colunas[1].equals("") ? "0.0" : colunas[1]) / 100);
                            dirfItem.setValorDependentesFEV(Double.parseDouble(colunas[2].equals("") ? "0.0" : colunas[2]) / 100);
                            dirfItem.setValorDependentesMAR(Double.parseDouble(colunas[3].equals("") ? "0.0" : colunas[3]) / 100);
                            dirfItem.setValorDependentesABR(Double.parseDouble(colunas[4].equals("") ? "0.0" : colunas[4]) / 100);
                            dirfItem.setValorDependentesMAI(Double.parseDouble(colunas[5].equals("") ? "0.0" : colunas[5]) / 100);
                            dirfItem.setValorDependentesJUN(Double.parseDouble(colunas[6].equals("") ? "0.0" : colunas[6]) / 100);
                            dirfItem.setValorDependentesJUL(Double.parseDouble(colunas[7].equals("") ? "0.0" : colunas[7]) / 100);
                            dirfItem.setValorDependentesAGO(Double.parseDouble(colunas[8].equals("") ? "0.0" : colunas[8]) / 100);
                            dirfItem.setValorDependentesSET(Double.parseDouble(colunas[9].equals("") ? "0.0" : colunas[9]) / 100);
                            dirfItem.setValorDependentesOUT(Double.parseDouble(colunas[10].equals("") ? "0.0" : colunas[10]) / 100);
                            dirfItem.setValorDependentesNOV(Double.parseDouble(colunas[11].equals("") ? "0.0" : colunas[11]) / 100);
                            dirfItem.setValorDependentesDEZ(Double.parseDouble(colunas[12].equals("") ? "0.0" : colunas[12]) / 100);
                            dirfItem.setValorDependentesDEC(Double.parseDouble(colunas[13].equals("") ? "0.0" : colunas[13]) / 100);

                            break;

                        case "RTPA":

                            dirfItem.setAnoExercicio(anoExercicio);
                            dirfItem.setAnoCalendario(anoCalendario);
                            dirfItem.setSigla(colunas[0]);
                            dirfItem.setRetencao(retencao);
                            /*****************************/
                            dirfItem.setValorImpostoRetidoJAN(Double.parseDouble(colunas[1].equals("") ? "0.0" : colunas[1]) / 100);
                            dirfItem.setValorImpostoRetidoFEV(Double.parseDouble(colunas[2].equals("") ? "0.0" : colunas[2]) / 100);
                            dirfItem.setValorImpostoRetidoMAR(Double.parseDouble(colunas[3].equals("") ? "0.0" : colunas[3]) / 100);
                            dirfItem.setValorImpostoRetidoABR(Double.parseDouble(colunas[4].equals("") ? "0.0" : colunas[4]) / 100);
                            dirfItem.setValorImpostoRetidoMAI(Double.parseDouble(colunas[5].equals("") ? "0.0" : colunas[5]) / 100);
                            dirfItem.setValorImpostoRetidoJUN(Double.parseDouble(colunas[6].equals("") ? "0.0" : colunas[6]) / 100);
                            dirfItem.setValorImpostoRetidoJUL(Double.parseDouble(colunas[7].equals("") ? "0.0" : colunas[7]) / 100);
                            dirfItem.setValorImpostoRetidoAGO(Double.parseDouble(colunas[8].equals("") ? "0.0" : colunas[8]) / 100);
                            dirfItem.setValorImpostoRetidoSET(Double.parseDouble(colunas[9].equals("") ? "0.0" : colunas[9]) / 100);
                            dirfItem.setValorImpostoRetidoOUT(Double.parseDouble(colunas[10].equals("") ? "0.0" : colunas[10]) / 100);
                            dirfItem.setValorImpostoRetidoNOV(Double.parseDouble(colunas[11].equals("") ? "0.0" : colunas[11]) / 100);
                            dirfItem.setValorImpostoRetidoDEZ(Double.parseDouble(colunas[12].equals("") ? "0.0" : colunas[12]) / 100);
                            dirfItem.setValorImpostoRetidoDEC(Double.parseDouble(colunas[13].equals("") ? "0.0" : colunas[13]) / 100);

                            break;

                        case "RTIRF":

                            dirfItem.setAnoExercicio(anoExercicio);
                            dirfItem.setAnoCalendario(anoCalendario);
                            dirfItem.setSigla(colunas[0]);
                            dirfItem.setRetencao(retencao);
                            /*****************************/
                            dirfItem.setValorImpostoRetidoJAN(Double.parseDouble(colunas[1].equals("") ? "0.0" : colunas[1]) / 100);
                            dirfItem.setValorImpostoRetidoFEV(Double.parseDouble(colunas[2].equals("") ? "0.0" : colunas[2]) / 100);
                            dirfItem.setValorImpostoRetidoMAR(Double.parseDouble(colunas[3].equals("") ? "0.0" : colunas[3]) / 100);
                            dirfItem.setValorImpostoRetidoABR(Double.parseDouble(colunas[4].equals("") ? "0.0" : colunas[4]) / 100);
                            dirfItem.setValorImpostoRetidoMAI(Double.parseDouble(colunas[5].equals("") ? "0.0" : colunas[5]) / 100);
                            dirfItem.setValorImpostoRetidoJUN(Double.parseDouble(colunas[6].equals("") ? "0.0" : colunas[6]) / 100);
                            dirfItem.setValorImpostoRetidoJUL(Double.parseDouble(colunas[7].equals("") ? "0.0" : colunas[7]) / 100);
                            dirfItem.setValorImpostoRetidoAGO(Double.parseDouble(colunas[8].equals("") ? "0.0" : colunas[8]) / 100);
                            dirfItem.setValorImpostoRetidoSET(Double.parseDouble(colunas[9].equals("") ? "0.0" : colunas[9]) / 100);
                            dirfItem.setValorImpostoRetidoOUT(Double.parseDouble(colunas[10].equals("") ? "0.0" : colunas[10]) / 100);
                            dirfItem.setValorImpostoRetidoNOV(Double.parseDouble(colunas[11].equals("") ? "0.0" : colunas[11]) / 100);
                            dirfItem.setValorImpostoRetidoDEZ(Double.parseDouble(colunas[12].equals("") ? "0.0" : colunas[12]) / 100);
                            dirfItem.setValorImpostoRetidoDEC(Double.parseDouble(colunas[13].equals("") ? "0.0" : colunas[13]) / 100);

                            break;
                    }

                }

                if (empresa.getCnpj() != null && empresaDAO.getByCNPJ(empresa.getCnpj()) == null) {
                    empresaDAO.salvar(empresa);
                }

                if (beneficiario.getDocumento() != null) {
                    dirfItem.setBeneficiario(beneficiario);
                    dirfItemDAO.salvar(dirfItem);
                    dirfItem = new DirfItem();

                    System.out.println("GRAVOU ITEM");

                }

            }

        } catch (Exception ex) {
            Logger.getLogger(UploadMB.class.getName()).log(Level.SEVERE, null, ex);
        }

    }

}
